home *** CD-ROM | disk | FTP | other *** search
/ DS-CD ROM 2 1993 August / DS CD-ROM 2.Ausgabe (August 1993).iso / programm / ds0334 / sim51_04.arj / BEF51.DOC < prev    next >
Text File  |  1993-01-03  |  39KB  |  1,179 lines

  1.     Befehlssatz der 8051 Mikrocontroller:
  2.     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  3.     Dieser Text  enthält eine Aufstellung  aller  Maschinenbefehle des
  4.     8051. Alle Weiterentwicklungen besitzen denselben Befehlssatz. Sie
  5.     unterscheiden sich nur in erweiterten Funktionen,  die werden aber
  6.     über zusätzliche Spezial-Funktion-Register (SFR) gesteuert.
  7.  
  8.  
  9.     Opcodes:
  10.     ~~~~~~~~
  11.     Die Maschinenbefehle werden im Programmspeicher als Zahlenwerte ab-
  12.     gelegt.
  13.             ┌──────────┬───────────┬───────────┐
  14.             │  OpCode  │ 1.Operant │ 2.Operant │
  15.             └──────────┴───────────┴───────────┘
  16.     
  17.     Für den Operations-Code sind Werte von  0 bis 255  zulässig. Damit
  18.     können bis zu 256 Befehle unterschieden werden. Die Operanten sind
  19.     optional. Somit belegt ein Befehl 1 bis 3 Byte im Speicher.
  20.     
  21.  
  22.     Cyclen:
  23.     ~~~~~~~
  24.     Die CPU's der 8051-Reihe können mit  1,2...12 MHz (neue Typen auch
  25.     bis 20 MHz) getacktet werden. 
  26.  
  27.     Quarz-Takt:  ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌
  28.             ─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘
  29.     System-Takt: |  S1   |  S2   |  S3   |  S4   |  S5   |  S6   |  S1
  30.              |<------------------ 1. Cyclus ---------------->|<---
  31.              |     ^Code-Fetch             ^Code-Fetch
  32.  
  33.     Der Code-Fetch (für OpCode) eines abzuarbeitenden Befehls  erfolgt
  34.     in S1. In S4 wird der 1.Operant gelesen. Bei Befehlen ohne Operan-
  35.     ten wird der Wert wieder verworfen.  In S5/S6 wird der Befehl aus-
  36.     geführt, der Cyclus ist beendet. Nun gibt es auch Befehle mit zwei
  37.     Operanten  oder die mehr Zeit zur Ausführung benötigen.  Sie benö-
  38.     tigen dann 2 oder 4 Cycluse.
  39.     Je Cyclus  erfolgen immer zwei Code-Fechtes (außer bei MOVX).  Zu-
  40.     viel gelesener Code wird wieder  verworfen, indem der PC (Programm
  41.     Counter) nicht erhöht wird.
  42.  
  43.  
  44.     Mnemonics:
  45.     ~~~~~~~~~~
  46.     Die Zahlencodes für die Befehle werden üblich mit  einem Assembler
  47.     generiert. Der Programmierer hat so nicht nicht mit Zahlen zu jon-
  48.     glieren, sondern kann die Befehle in Worten (Mnemonics) hinschrei-
  49.     ben, die dann vom Assembler übersetzt werden.
  50.  
  51.  
  52.  
  53.  
  54.     Im folgenden werden die 8051-Befehle beschrieben, es werden Opcode
  55.     und Mnemonics, die benötigte Cycluse  und die sich ändernden Flags
  56.     angegeben. Weitere Ausführungen  zur 8051-Hardware und zu den ver-
  57.     wendeten Abkürzungen finden sich am Ende dises Textes.
  58.  
  59.  
  60.     ──────────────────────────────────────────────────────────────────
  61.     ACALL                        Flags: -
  62.  
  63.     Absolute CALL (innerhalb 2 KByte Page):
  64.  
  65.     Der PC (Programm-Counter) wird um  2 incrementiert und die Return-
  66.     Adresse auf den Stack gelegt (low Byte zuerst).  Für den Einsprung
  67.     ins Unterprogramm. wird die Adresse folgendermaßen gebildet:
  68.  
  69.        A11 bis A15 im PC (Programm-Counter) bleiben unverändert,
  70.        die unteren 11 Bit werden aus dem Opcode geladen.
  71.  
  72.                ┌────────────────┬───────────────────────┐
  73.     ACALL codeAdr  │A10 A9 A8 1 0001│A7 A6 A5 A4 A3 A2 A1 A0│   2 Cyc
  74.                └────────────────┴───────────────────────┘
  75.  
  76.  
  77.  
  78.     ──────────────────────────────────────────────────────────────────
  79.     ADD                        Flags: CY AC P OV
  80.  
  81.     Addiere zu ACC
  82.  
  83.     Addiere  Wert,  Register-Inhalt  oder  intern RAM-Inhalt  zum ACC.
  84.     Nach der Ausführung hält der  ACC das Ergebnis,  CY hält den Über-
  85.     trag aus Bit 7 und AC hält den Übertrag aus Bit 3. Das OV-Flag ist
  86.     gesetzt, wenn ein Vorzeichenfehler auftrat.
  87.  
  88.                ┌─────────┬─────────┐
  89.     ADD A, #wert   │   24h   │   wert  │   1 Cyc
  90.                ├─────────┼─────────┘
  91.     ADD A, @Ri     │0010 011i│             1 Cyc
  92.                ├─────────┤
  93.     ADD A, Rn      │0010 1nnn│             1 Cyc
  94.                ├─────────┼─────────┐
  95.     ADD A, data    │   25h   │   data  │   1 Cyc
  96.                └─────────┴─────────┘
  97.  
  98.  
  99.  
  100.     ──────────────────────────────────────────────────────────────────
  101.     ADDC                        Flags: CY AC P OV
  102.  
  103.     Addiere mit Übertrag zu ACC
  104.  
  105.     Addiere Wert, Register-Inhalt, oder intern RAM-Inhalt und  CY  zum
  106.     ACC.  Nach der Ausführung hält der  ACC das Ergebnis,  CY hält den
  107.     Übertrag aus Bit 7 und AC hält den Übertrag aus    Bit 3. Das OV-Flag
  108.     ist gesetzt, wenn ein Vorzeichenfehler auftrat.
  109.  
  110.                ┌─────────┬─────────┐
  111.     ADDC A, #wert  │   34h   │   wert  │   1 Cyc
  112.                ├─────────┼─────────┘
  113.     ADDC A, @Ri    │0011 011i│             1 Cyc
  114.                ├─────────┤
  115.     ADDC A, Rn     │0011 1nnn│             1 Cyc
  116.                ├─────────┼─────────┐
  117.     ADDC A, data   │   35h   │   data  │   1 Cyc
  118.                └─────────┴─────────┘
  119.  
  120.     ──────────────────────────────────────────────────────────────────
  121.     AJMP                        Flags: -
  122.  
  123.     Absoluter Sprung (innerhalb 2 KByte Page):
  124.  
  125.     Der PC wird um  2 incrementiert, die Zieladresse wird dann folgen-
  126.     dermaße gebildet:
  127.  
  128.        A11 bis A15 im PC (Programm-Counter) bleiben unverändert,
  129.        die unteren 11 Bit werden aus dem Opcode geladen.
  130.  
  131.                ┌────────────────┬───────────────────────┐
  132.     AJMP codeAdr   │A10 A9 A8 0 0001│A7 A6 A5 A4 A3 A2 A1 A0│   2 Cyc
  133.                └────────────────┴───────────────────────┘
  134.  
  135.  
  136.  
  137.  
  138.     ──────────────────────────────────────────────────────────────────
  139.     ANL                        Flags: -
  140.  
  141.     Logisch AND zu ACC, intern RAM oder SFR
  142.  
  143.     Der Inhalt der angegebenen Register wird bitweise logisch AND ver-
  144.     knüpft und im ersten Register gespeichert.
  145.  
  146.              ┌─────────┬─────────┐
  147.     ANL A, #wert     │   54h   │  wert   │             1 Cyc   P-Flag
  148.              ├─────────┼─────────┘
  149.     ANL A, @Ri       │0101 011i│                       1 Cyc   P-Flag
  150.              ├─────────┤
  151.     ANL A, Rn        │0101 1nnn│                       1 Cyc   P-Flag
  152.              ├─────────┼─────────┐
  153.     ANL A, data      │   55h   │  data   │             1 Cyc   P-Flag
  154.              ├─────────┼─────────┤
  155.     ANL data, A      │   52h   │  data   │             1 Cyc
  156.              ├─────────┼─────────┼─────────┐
  157.     ANL data, #wert  │   53h   │  data   │  wert   │   2 Cyc
  158.              └─────────┴─────────┴─────────┘
  159.  
  160.  
  161.  
  162.     (Anmerkung: X AND Y = 1 nur dann, wenn beide X=1 und Y=1)
  163.  
  164.     ──────────────────────────────────────────────────────────────────
  165.     ANL                        Flags: CY
  166.  
  167.     Logisch AND zum CY-Flag
  168.  
  169.     Der Inhalt der angegebenen Bit-Adresse wird logisch AND mit dem CY-
  170.     Flag verknüpft. /bit bedeutet, das der negierte Bit-Inhalt verwen-
  171.     det wird. 
  172.  
  173.                ┌─────────┬─────────┐
  174.     ANL C, bit     │   82h   │ bitAdr  │   2 Cyc
  175.                ├─────────┼─────────┤
  176.     ANL C, /bit    │   B0h   │ bitAdr  │   2 Cyc
  177.                └─────────┴─────────┘
  178.  
  179.  
  180.     ──────────────────────────────────────────────────────────────────
  181.     CJNE                        Flags: CY
  182.  
  183.     Vergleiche und springe, wenn nicht gleich
  184.  
  185.     Ist der linke Operand  kleiner als der Rechte, so ist anschließend
  186.     das Carry Flag gesetzt (CY = 1).
  187.  
  188.                  ┌─────────┬─────────┬─────────┐
  189.     CJNE A, data, codeAdr    │   B5h   │   data  │ Offset  │   2 Cyc
  190.                  ├─────────┼─────────┼─────────┤
  191.     CJNE A, #wert, codeAdr   │   B4h   │   wert  │ Offset  │   2 Cyc
  192.                  ├─────────┼─────────┼─────────┤
  193.     CJNE Rn, #wert, codeAdr  │1011 1nnn│   wert  │ Offset  │   2 Cyc
  194.                  ├─────────┼─────────┼─────────┤
  195.     CJNE @Ri, #wert, codeAdr │1011 011i│   wert  │ Offset  │   2 Cyc
  196.                  └─────────┴─────────┴─────────┘
  197.  
  198.  
  199.  
  200.  
  201.  
  202.     ──────────────────────────────────────────────────────────────────
  203.     CLR                        Flags: P
  204.  
  205.     Lösche ACC
  206.                ┌─────────┐
  207.     CLR A          │   E4h   │   1 Cyc
  208.                └─────────┘
  209.  
  210.  
  211.  
  212.  
  213.     ──────────────────────────────────────────────────────────────────
  214.     CLR                        Flags: CY
  215.  
  216.     Lösche Bit
  217.                ┌─────────┐
  218.     CLR C          │   C3h   │             1 Cyc
  219.                ├─────────┼─────────┐
  220.     CLR bit        │   C2h   │ bitAdr  │   1 Cyc     no Flags
  221.                └─────────┴─────────┘
  222.  
  223.  
  224.  
  225.  
  226.  
  227.     ──────────────────────────────────────────────────────────────────
  228.     CPL                        Flags: P
  229.  
  230.     Einerkomplement zu ACC (= ACC bitweise invertieren)
  231.  
  232.     Der Befehlssatz des 8051 kennt kein  Zweierkomlement. Es kann aber
  233.     gebildet werden durch CPL A mit anschließenden INC A.
  234.  
  235.                ┌─────────┐
  236.     CPL A          │   F4h   │   1 Cyc
  237.                └─────────┘
  238.  
  239.  
  240.     ──────────────────────────────────────────────────────────────────
  241.     CPL                        Flags: CY
  242.  
  243.     Invertiere Bit
  244.                ┌─────────┐
  245.     CPL C          │   B3h   │             1 Cyc
  246.                ├─────────┼─────────┐
  247.     CPL bit        │   B2h   │ bitAdr  │   1 Cyc    no Flags
  248.                └─────────┴─────────┘
  249.  
  250.  
  251.  
  252.     ──────────────────────────────────────────────────────────────────
  253.     DA                        Flags: CY P
  254.  
  255.     Decimal Adjust von ACC nach BCD-Addition
  256.  
  257.     Wurden zwei  BCD Zahlen miteinander addiert, so muß danach das Er-
  258.     gebnis korrigiert werden,  soll es auch im  BCD-Format erscheinen.
  259.     Ist das  AC-Flag gesetzt, oder das low Nibble > 9, dann wird 6 ad-
  260.     diert. Ist das C-Flag gesetzt, oder das high Nibble > 9, dann wird
  261.     60h addiert. Wenn beim Ergebnis ein Übertrag von Bit 7 des ACC er-
  262.     folgt, wird das Carry-Flag (C=1) gesetzt.
  263.  
  264.                ┌─────────┐
  265.     DA A           │   D4h   │   1 Cyc
  266.                └─────────┘
  267.  
  268.     Beispiel:                bcd_59 = 0101 1001
  269.                  bcd_68 = 0110 1000
  270.                      +  ────────────
  271.           nach ADD:                   1100 0001    (Flags: AC=1, CY=0)
  272.           wegen (AC=1):               0000 0110
  273.           wegen (high Nibble>9):      0110 0000
  274.                      +  ────────────
  275.           BCD-Ergebnis:      bcd_27 = 0010 0111    (Flags: CY=1)
  276.  
  277.     Das richtige Ergebnis wäre  59 + 68 = 127. Hier ist aber ein Über-
  278.     lauf, daher nur 27 und das CY-Flag ist gesetzt.
  279.  
  280.  
  281.  
  282.     ──────────────────────────────────────────────────────────────────
  283.     DEC                        Flags: -
  284.  
  285.     Decrement
  286.     
  287.     Der Inhalt der angegebenen Register wird um 1 erniedrigt.
  288.  
  289.                ┌─────────┐
  290.     DEC A          │   14h   │             1 Cyc    P-Flag 
  291.                ├─────────┤
  292.     DEC Rn         │0001 1nnn│             1 Cyc
  293.                ├─────────┤
  294.     DEC @Ri        │0001 011i│             1 Cyc
  295.                ├─────────┼─────────┐
  296.     DEC data       │   15h   │  data   │   1 Cyc
  297.                       └─────────┴─────────┘
  298.  
  299.  
  300.     ──────────────────────────────────────────────────────────────────
  301.     DIV                        Flags: CY P OV
  302.  
  303.     Dividiere Akku durch B-Register
  304.  
  305.     Das Ergebnis steht im ACC und der Rest in B. Bei einem Fehler (Di-
  306.     vision durch 0) ist das OV-Flag gesetzt. Das Carry Flag wird immer
  307.     gelöscht.
  308.                ┌─────────┐
  309.     DIV AB         │   84h   │   4 Cyc
  310.                └─────────┘
  311.  
  312.  
  313.  
  314.  
  315.  
  316.  
  317.  
  318.     ──────────────────────────────────────────────────────────────────
  319.     DJNZ                        Flags: -
  320.  
  321.     Decrementiere den Inhalt des angegeben Registers und springe, wenn
  322.     nicht 0.
  323.  
  324.                 ┌─────────┬─────────┐
  325.     DJNZ Rn, codeAdr    │1101 1nnn│ Offset  │             2 Cyc
  326.                 ├─────────┼─────────┼─────────┐
  327.     DJNZ data, codeAdr  │   D5h   │  data   │ Offset  │   2 Cyc
  328.                 └─────────┴─────────┴─────────┘
  329.  
  330.  
  331.  
  332.  
  333.  
  334.  
  335.  
  336.     ──────────────────────────────────────────────────────────────────
  337.     INC                        Flags: -
  338.  
  339.     Increment
  340.  
  341.     Der Inhalt der angegebenen Register wird um 1 erhöht.
  342.  
  343.                ┌─────────┐
  344.     INC A          │   04h   │             1 Cyc    P-Flag
  345.                ├─────────┤
  346.     INC Rn         │0000 1nnn│             1 Cyc
  347.                ├─────────┤
  348.     INC @Ri        │0000 011i│             1 Cyc
  349.                ├─────────┼─────────┐
  350.     INC data       │   05h   │  data   │   1 Cyc
  351.                ├─────────┼─────────┘
  352.     INC DPTR       │   A3h   │             2 Cyc    *16-Bit-Befehl
  353.                └─────────┘
  354.  
  355.  
  356.  
  357.  
  358.  
  359.  
  360.     ──────────────────────────────────────────────────────────────────
  361.     J? = Bedingter Sprung                Flags: -
  362.  
  363.     Sprung, wenn die Bedingung  erfüllt ist. Für  die Zieladresse wird
  364.     der PC erhöht, dann wird der vorzeichenbehaftete Offset addiert.
  365.  
  366.         JZ  --> springe, wenn ACC = 0
  367.         JNZ --> springe, wenn ACC nicht 0
  368.         JC  --> springe, wenn CY = 1
  369.         JNC --> springe, wenn CY = 0
  370.         JB  --> springe, wenn Bit = 1
  371.         JNB --> springe, wenn Bit = 0
  372.         JBC --> springe, wenn Bit = 1 und lösche Bit
  373.  
  374.               ┌─────────┬─────────┐
  375.     JZ codeAdr        │   60h   │ Offset  │            2 Cyc
  376.               ├─────────┼─────────┤
  377.     JNZ codeAdr       │   70h   │ Offset  │            2 Cyc
  378.               ├─────────┼─────────┤
  379.     JC codeAdr        │   40h   │ Offset  │            2 Cyc
  380.               ├─────────┼─────────┤
  381.     JNC codeAdr       │   50h   │ Offset  │            2 Cyc
  382.               ├─────────┼─────────┼─────────┐
  383.     JB bit, codeAdr   │   20h   │ bitAdr  │ Offset  │  2 Cyc
  384.               ├─────────┼─────────┼─────────┤
  385.     JNB bit, codeAdr  │   30h   │ bitAdr  │ Offset  │  2 Cyc
  386.               ├─────────┼─────────┼─────────┤
  387.     JBC bit, codeAdr  │   10h   │ bitAdr  │ Offset  │  2 Cyc
  388.               └─────────┴─────────┴─────────┘
  389.  
  390.  
  391.  
  392.     ──────────────────────────────────────────────────────────────────
  393.     JMP                        Flags: -
  394.  
  395.     Springe indirekt
  396.  
  397.     Der Programm Counter (PC) wird mit  der Summe aus ACC und DPTR ge-
  398.     laden (= Sprung zu dieser Adresse).
  399.  
  400.                ┌─────────┐
  401.     JMP @A+DPTR    │   73h   │   2 Cyc
  402.                └─────────┘
  403.  
  404.  
  405.  
  406.     ──────────────────────────────────────────────────────────────────
  407.     LCALL                        Flags: -
  408.  
  409.     Long CALL
  410.  
  411.     Der PC (Programm Counter) wird um  3 incrementiert und die Return-
  412.     Adresse auf den  Stack gelegt (low Byte zuerst).  Dann erfolgt der
  413.     Sprung an die angegebene Adresse.
  414.  
  415.                ┌─────────┬────────────┬───────────┐
  416.     LCALL codeAdr  │   12h   │HIGH(codAdr)│LOW(codAdr)│   2 Cyc
  417.                └─────────┴────────────┴───────────┘
  418.  
  419.  
  420.     ──────────────────────────────────────────────────────────────────
  421.     LJMP                        Flags: -
  422.  
  423.     Long JUMP
  424.  
  425.     Sprung zur im Opcode angegebenen Adresse.
  426.  
  427.                ┌─────────┬────────────┬───────────┐
  428.     LJMP codeAdr   │   02h   │HIGH(codAdr)│LOW(codAdr)│   2 Cyc
  429.                └─────────┴────────────┴───────────┘
  430.  
  431.  
  432.  
  433.  
  434.  
  435.     ──────────────────────────────────────────────────────────────────
  436.     MOV                        Flags: -
  437.  
  438.     Schreibe/Kopiere in ACC, internes RAM oder SFR
  439.  
  440.     Jeweils der  in der Mnemonic rechts stehende  Operand wird  in den
  441.     Linken geschrieben. Bemerkenswert ist, daß bei  "MOV data1, data2"
  442.     die Reihenfolge im Hexcode gegenüber der im Memomic vertauscht ist.
  443.  
  444.               ┌─────────┐
  445.     MOV A, Rn         │1110 1nnn│                    1 Cyc    P-Flag
  446.               ├─────────┤
  447.     MOV A, @Ri        │1110 011i│                    1 Cyc    P-Flag
  448.               ├─────────┼─────────┐
  449.     MOV A, data       │   E5h   │  data   │          1 Cyc    P-Flag
  450.               ├─────────┼─────────┤
  451.     MOV A, #wert      │   74h   │  wert   │          1 Cyc    P-Flag
  452.               └─────────┴─────────┘
  453.               ┌─────────┐
  454.     MOV Rn, A         │1111 1nnn│                       1 Cyc
  455.               ├─────────┼──────────┐
  456.     MOV Rn, data      │1010 1nnn│   data   │            2 Cyc
  457.               ├─────────┼──────────┤
  458.     MOV Rn, #wert     │0111 1nnn│   wert   │            1 Cyc
  459.               ├─────────┼──────────┘
  460.     MOV @Ri, A        │1111 011i│                       1 Cyc
  461.               ├─────────┼──────────┐
  462.     MOV @Ri, data     │1010 011i│   data   │            2 Cyc
  463.               ├─────────┼──────────┤
  464.     MOV @Ri, #wert    │0111 011i│   wert   │            1 Cyc
  465.               ├─────────┼──────────┤
  466.     MOV data, A       │   F5h   │   data   │            1 Cyc
  467.               ├─────────┼──────────┤
  468.     MOV data, Rn      │1000 1nnn│   data   │            2 Cyc
  469.               ├─────────┼──────────┤
  470.     MOV data, @Ri     │1000 011i│   data   │            2 Cyc
  471.               ├─────────┼──────────┼─────────┐
  472.     MOV data, #wert   │   75h   │   data   │   wert  │  2 Cyc
  473.               ├─────────┼──────────┼─────────┤
  474.     MOV data1, data2  │   85h   │   data2  │  data1  │  2 Cyc
  475.               ├─────────┼──────────┼─────────┤
  476.     MOV DPTR, #wert   │   90h   │HIGH(wert)│LOW(wert)│  2 Cyc  *16-Bit
  477.               └─────────┴──────────┴─────────┘
  478.  
  479.  
  480.     ──────────────────────────────────────────────────────────────────
  481.     MOV                        Flags: -
  482.  
  483.     Kopiere Bit
  484.     
  485.     Kopiere Inhalt aus Bit-Adresse in C bzw. C in Bit-Adresse.
  486.  
  487.                ┌─────────┬─────────┐
  488.     MOV C, bit     │   A2h   │ bitAdr  │   1 Cyc     CY-Flag
  489.                ├─────────┼─────────┤
  490.     MOV bit, C     │   92h   │ bitAdr  │   2 Cyc
  491.                └─────────┴─────────┘
  492.  
  493.  
  494.  
  495.  
  496.  
  497.  
  498.  
  499.  
  500.  
  501.  
  502.  
  503.  
  504.  
  505.     ──────────────────────────────────────────────────────────────────
  506.     MOVC                        Flags: P
  507.  
  508.     Lese Code-Byte
  509.  
  510.     Ein Byte aus  dem Programmspeicher  wird  in den ACC  gelesen. Die
  511.     Adresse wird aus der  Summe der  Inhalte vom ACC und dem DPTR bzw.
  512.     dem  (zuvor um 1 erhöhten)  Programm-Counter gebildet. Der Zugriff
  513.     erfolgt anstelle des ersten Code-Fetch im zweiten Cyclus.
  514.  
  515.     Mit MOVC können beispielsweise Tabellen im EPROM gelesen werden.
  516.  
  517.                ┌─────────┐
  518.     MOVC A, @A+DPTR    │   93h   │   2 Cyc
  519.                ├─────────┤
  520.     MOVC A, @A+PC      │   83h   │   2 Cyc
  521.                └─────────┘
  522.  
  523.     Beachte: Beim externen Programmspeicherzugriff wird die Code-Adres-
  524.        se multipexed an den Pins von Port P0 und P2 ausgegeben. Automa-
  525.        tisch schreibt die CPU  #0FFh  in das Latch von P0!  Der Inhalt
  526.        von P2 ändert sich nicht.
  527.  
  528.  
  529.  
  530.     ──────────────────────────────────────────────────────────────────
  531.     MOVX                        Flags: -
  532.  
  533.     externer Daten-Speicher-Zugriff
  534.  
  535.     Der Zugriff  auf den  externen Datenspeicher erfolgt  anstelle der
  536.     beiden Code-Fetch im zweiten Cyclus. Beim Zugriff  @DPTR  wird die
  537.     XDATA-Adresse multiplexed an den Pins von Port P0 und P2  ausgege-
  538.     ben. Beim Zugriff  @Ri liegt der Inhalt des P2-Latches während des
  539.     Zugriffs an den P2-Pins, der Inhalt von Ri wird multiplexed an den
  540.     P0-Pins  ausgegeben.  Hier hat der Anwender vor dem Zugriff selbst
  541.     das High-Byte der Adresse in P2 zu schreiben.
  542.  
  543.              ┌─────────┐
  544.     MOVX A, @DPTR    │   E0h   │   2 Cyc      P-Flag
  545.              ├─────────┤
  546.     MOVX @DPTR, A    │   F0h   │   2 Cyc
  547.              ├─────────┤
  548.     MOVX A, @Ri      │1110 001i│   2 Cyc      P-Flag
  549.              ├─────────┤
  550.     MOVX @Ri, A      │1111 001i│   2 Cyc
  551.              └─────────┘
  552.  
  553.     Beachte:   Das P0-Latch wird von  der CPU-Hardware vor dem Zugriff
  554.        mit  #0FFh überschrieben, der Inhalt des P2-Latch bleibt jedoch
  555.        erhalten. Der Inhalt des  P2-Latches  kann nicht  zurückgelesen
  556.        werden.  Ein Lesezugriff erfolgt von den Pins, nicht vom Latch.
  557.        Bei externen Code-Fetch können sogar die Pins nicht gelesen wer-
  558.        den, man bekäme nur immer die letzte High-Code-Adresse.
  559.  
  560.  
  561.  
  562.     ──────────────────────────────────────────────────────────────────
  563.     MUL                        Flags: CY P OV
  564.  
  565.     Multipiziere Akku mit B-Register:
  566.  
  567.     Das Ergebnis steht in ACC. Wenn das Ergebnis größer als 8 Bit ist,
  568.     steht das low Byte in ACC, das High Byte in B und das  OV-Flag ist
  569.     gesetzt. Das CY-Flag wird immer gelöscht.
  570.  
  571.                ┌─────────┐
  572.     MUL AB         │   A4h   │   4 Cyc
  573.                └─────────┘
  574.  
  575.  
  576.  
  577.  
  578.     ──────────────────────────────────────────────────────────────────
  579.     NOP                        Flags: -
  580.  
  581.     No Operation.
  582.  
  583.     NOP ist oft dienlich, wenn eine Wartezeit benötigt wird. Bei einem
  584.     Takt von 12 MHz dauert ein NOP 1 µs.
  585.  
  586.                ┌─────────┐
  587.     NOP            │   00h   │   1 Cyc
  588.                └─────────┘
  589.  
  590.     ──────────────────────────────────────────────────────────────────
  591.     ORL                        Flags: -
  592.  
  593.     Logisch OR zu ACC, intern RAM oder SFR
  594.  
  595.     Der Inhalt der angegebenen Register wird  bitweise logisch OR ver-
  596.     knüpft und im ersten Register gespeichert.
  597.  
  598.               ┌─────────┬─────────┐
  599.     ORL A, #wert      │   44h   │  wert   │             1 Cyc   P-Flag
  600.               ├─────────┼─────────┘
  601.     ORL A, @Ri        │0100 011i│                       1 Cyc   P-Flag
  602.               ├─────────┤
  603.     ORL A, Rn         │0100 1nnn│                       1 Cyc   P-Flag
  604.               ├─────────┼─────────┐
  605.     ORL A, data       │   45h   │  data   │             1 Cyc   P-Flag
  606.               ├─────────┼─────────┤
  607.     ORL data, A       │   42h   │  data   │             1 Cyc
  608.               ├─────────┼─────────┼─────────┐
  609.     ORL data, #wert   │   43h   │  data   │  wert   │   2 Cyc
  610.               └─────────┴─────────┴─────────┘
  611.  
  612.  
  613.  
  614.  
  615.     (Anmerkung: X OR Y = 1 dann, wenn auch nur eines X=1 oder Y=1)
  616.  
  617.     ──────────────────────────────────────────────────────────────────
  618.     ORL                        Flags: CY
  619.  
  620.     Logisch OR zum CY-Flag
  621.  
  622.     Der Inhalt der angegebenen Bit-Adresse wird logisch  OR mit dem CY-
  623.     Flag verknüpft. /bit bedeutet, das der negierte Bit-Inhalt verwen-
  624.     det wird.
  625.  
  626.                ┌─────────┬─────────┐
  627.     ORL C, bit     │   72h   │ bitAdr  │   2 Cyc
  628.                ├─────────┼─────────┤
  629.     ORL C, /bit    │   A0h   │ bitAdr  │   2 Cyc
  630.                └─────────┴─────────┘
  631.  
  632.  
  633.  
  634.  
  635.     ──────────────────────────────────────────────────────────────────
  636.     POP                        Flags: -
  637.  
  638.     Byte vom Stack holen
  639.  
  640.     Beim POP wird das BYTE  @SP  gelesen und in die  angegebene intern
  641.     RAM- bzw. SFR-Adresse geschrieben, dann wird der SP decrementiert.
  642.     Siehe auch PUSH, RET, RETI, Calls und die Bemerkungen zum Stack am
  643.     Ende des Textes.
  644.                             gleich:
  645.                ┌─────────┬─────────┐                MOV data, @SP
  646.     POP data       │   D0h   │  data   │   2 Cyc        DEC SP
  647.                └─────────┴─────────┘
  648.  
  649.  
  650.     ──────────────────────────────────────────────────────────────────
  651.     PUSH                        Flags: -
  652.  
  653.     Byte auf Stack schieben
  654.  
  655.     Beim PUSH wird der SP um incrementiert und dann der Inhalt der an-
  656.     gegebenen intern RAM- bzw. SFR-Adresse in  @SP geschrieben. Der SP
  657.     zeigt immer auf das zuletzt gepushte Byte.
  658.     Ist der Stack voll (SP zeigt auf Adressen oberhalb 7Fh beim 8051),
  659.     so wird trotzdem bei einem  PUSH  der SP incrementiert, die Daten
  660.     gehen aber verloren.
  661.                             gleich:
  662.                ┌─────────┬─────────┐                INC SP
  663.     PUSH data      │   C0h   │  data   │   2 Cyc        MOV @SP, data
  664.                └─────────┴─────────┘
  665.  
  666.  
  667.  
  668.     ──────────────────────────────────────────────────────────────────
  669.     RET                        Flags: -
  670.  
  671.     Return von Unterprogramm:
  672.  
  673.     Bei einem LCALL oder ACALL  wurde die Return-Adresse auf dem Stack
  674.     abgelegt. Mit  RET  wird sie wieder zurück in den Programm Counter
  675.     geladen, was  einem  Sprung dorthin  gleichkommt. Man beachte, das
  676.     eine Code-Adresse  2 Byte  auf dem Stack  belegt. Zuerst wurde das
  677.     Low Byte  gepushed, dann das High Byte. In umgekehrter Reihenfolge
  678.     werden sie wieder gepoped.
  679.                             gleich:
  680.                ┌─────────┐                      MOV HIGH(PC), @SP
  681.     RET            │   22h   │   2 Cyc              DEC SP
  682.                └─────────┘                      MOV LOW(PC), @SP
  683.                             DEC SP
  684.  
  685.  
  686.  
  687.     ──────────────────────────────────────────────────────────────────
  688.     RETI                        Flags: -
  689.  
  690.     Return von Interrupt:
  691.  
  692.     Die Adresse wird in  gleicher Weise vom Stack geholt, wie bei RET.
  693.     Jedoch gibt es noch eine Besonderheit:   Beim 8051 gibt es 2 Prio-
  694.     ritätsstufen für Interrupts (beim 80517 auch mehr). Ist ein Inter-
  695.     rupt in Bearbeitung, sind alle Interrupts mit gleicher oder nieder-
  696.     er Priorität gesperrt.  RETI  gibt die  höchste aktive Prioritäts-
  697.     Stufe wieder frei.
  698.  
  699.                ┌─────────┐
  700.     RETI           │   32h   │   2 Cyc
  701.                └─────────┘
  702.  
  703.     Bemerkung:   Soll aus einer Interrupt-         CLR A
  704.      Routine heraus ein Software-Reset er-        PUSH ACC
  705.      folgen, so darf kein  LJMP 0000, son-        PUSH ACC
  706.      dern nur  eine Routine wie nebensteh-        ACALL retiReset
  707.      end verwendet werden.                retiReset:
  708.                             RETI
  709.  
  710.     ──────────────────────────────────────────────────────────────────
  711.     RL                        Flags: -
  712.  
  713.     Rotate ACC bitweise nach links
  714.  
  715.     Schiebt den Inhalt vom  ACC  bitweise nach links. Das  höchste Bit
  716.     wird dabei in  das niedrigste geschrieben.  Das Parity-Flag ändert
  717.     sich nicht, da die Summe über alle Bit's gleich bleibt.
  718.  
  719.                ┌─────────┐
  720.     RL A           │   23h   │   1 Cyc
  721.                └─────────┘
  722.  
  723.  
  724.  
  725.     ──────────────────────────────────────────────────────────────────
  726.     RLC                        Flags: CY P
  727.  
  728.     Rotate ACC bitweise nach links durch Carry
  729.  
  730.     Schiebt den Inhalt vom  ACC  bitweise nach links. Das  höchste Bit
  731.     wird dabei ins  CY-Flag und der vorige Inhalt des CY-Flag ins nie-
  732.     drigste    Bit vom ACC geschrieben.
  733.  
  734.                ┌─────────┐
  735.     RLC A          │   33h   │   1 Cyc
  736.                └─────────┘
  737.  
  738.  
  739.  
  740.  
  741.     ──────────────────────────────────────────────────────────────────
  742.     RR                        Flags: -
  743.  
  744.     Rotate ACC bitweise nach rechts
  745.  
  746.     Schiebt den Inhalt vom ACC bitweise nach rechts. Das niederste Bit
  747.     wird dabei in das höchste geschrieben. Das Parity-Flag ändert sich
  748.     nicht, da die Summe über alle Bit's gleich bleibt.
  749.  
  750.                ┌─────────┐
  751.     RR A           │   03h   │   1 Cyc
  752.                └─────────┘
  753.  
  754.  
  755.  
  756.     ──────────────────────────────────────────────────────────────────
  757.     RRC                        Flags: CY P
  758.  
  759.     Rotate ACC bitweise nach rechts durch Carry
  760.  
  761.     Schiebt den Inhalt vom ACC bitweise nach rechts. Das niederste Bit
  762.     wird dabei in das CY_Flag und der vorige Inhalt des CY-Flag in das
  763.     höchste Bit vom ACC geschrieben.
  764.  
  765.                ┌─────────┐
  766.     RRC C          │   13h   │   1 Cyc
  767.                └─────────┘
  768.  
  769.  
  770.     ──────────────────────────────────────────────────────────────────
  771.     SETB                        Flags: -
  772.  
  773.     Setze den Inhalt der angegebenen Bit-Adresse auf 1.
  774.  
  775.                ┌─────────┐
  776.     SETB C         │   D3h   │             1 Cyc    CY-Flag
  777.                ├─────────┼─────────┐
  778.     SETB bit       │   D2h   │ bitAdr  │   1 Cyc
  779.                └─────────┴─────────┘
  780.  
  781.  
  782.  
  783.  
  784.  
  785.  
  786.  
  787.     ──────────────────────────────────────────────────────────────────
  788.     SJMP                        Flags: -
  789.  
  790.     Short Jump um Offset -128..+127
  791.  
  792.     Der  Programm Counter  wird um  2 incrementiert und  dazu wird der
  793.     Offset addiert. Der im Code eingetragene Offset ist ein vorzeichen-
  794.     behaftetes Byte. Vor der Addition erfolgt eine Byte-->Word Konver-
  795.     tierung. (Anmerkung: Der Assembler-Programmierer braucht nicht mit
  796.     Offsets rumzujonglieren,  er schreibt das Label an, den Offset be-
  797.     rechnet der Assembler).
  798.  
  799.                ┌─────────┬─────────┐
  800.     SJMP codeAdr   │   80h   │ Offset  │   2 Cyc
  801.                └─────────┴─────────┘
  802.  
  803.  
  804.  
  805.  
  806.  
  807.  
  808.  
  809.     ──────────────────────────────────────────────────────────────────
  810.     SUBB                        Flags: CY AC P OV
  811.  
  812.     Subtrahiere vom Akku mit Übertrag
  813.  
  814.     Subtrahiere  Wert, Register-Inhalt, oder intern RAM-Inhalt und  CY
  815.     vom ACC. Nach der Ausführung hält der  ACC  das Ergebnis,  CY hält
  816.     den Übertrag aus Bit 7 und AC hält den Übertrag aus Bit 3. Das OV-
  817.     Flag ist gesetzt, wenn ein Vorzeichenfehler auftrat.
  818.  
  819.             ┌─────────┬─────────┐
  820.     SUBB A, #wert   │   94h   │   wert  │   1 Cyc
  821.             ├─────────┼─────────┘
  822.     SUBB A, @Ri     │1001 011i│             1 Cyc
  823.             ├─────────┤
  824.     SUBB A, Rn      │1001 1nnn│             1 Cyc
  825.             ├─────────┼─────────┐
  826.     SUBB A, data    │   95h   │  data   │   1 Cyc
  827.             └─────────┴─────────┘
  828.  
  829.  
  830.     ──────────────────────────────────────────────────────────────────
  831.     SWAP                        Flags: -
  832.  
  833.     Vertausche in ACC low Nibble (untere 4 Bits) mit high Nibble.
  834.  
  835.                ┌─────────┐
  836.     SWAP A         │   C4h   │   1 Cyc
  837.                └─────────┘
  838.  
  839.  
  840.  
  841.     ──────────────────────────────────────────────────────────────────
  842.     XCH                        Flags: P
  843.  
  844.     Tausche ACC-Inhalt mit intern RAM- bzw. SFR-Inhalt.
  845.  
  846.                ┌─────────┐
  847.     XCH A, Rn      │1100 1nnn│             1 Cyc
  848.                ├─────────┼─────────┐
  849.     XCH A, data    │   C5h   │  data   │   1 Cyc
  850.                ├─────────┼─────────┘
  851.     XCH A, @Ri     │1100 011i│             1 Cyc
  852.                └─────────┘
  853.  
  854.  
  855.     ──────────────────────────────────────────────────────────────────
  856.     XCHD                        Flags: P
  857.  
  858.     Tausche das Low-Nibble des  adressierten Byte im  internen RAM mit
  859.     dem Low_Nibble des ACC.
  860.  
  861.                ┌─────────┐
  862.     XCHD A, @Ri    │1101 011i│   1 Cyc
  863.                └─────────┘
  864.  
  865.  
  866.  
  867.     ──────────────────────────────────────────────────────────────────
  868.     XRL                        Flags: -
  869.  
  870.     Logisch XOR zu ACC, intern RAM oder SFR
  871.  
  872.     Der Inhalt der angegebenen Register wird bitweise logisch EXCLUSIV-
  873.     OR verknüpft und im ersten Register gespeichert.
  874.     (Anmerkung: X XOR Y = 1 dann, wenn X und Y verschieden)
  875.  
  876.              ┌─────────┬─────────┐
  877.     XRL A, #wert     │   64h   │  wert   │             1 Cyc    P-Flag
  878.              ├─────────┼─────────┘
  879.     XRL A, @Ri       │0110 011i│                       1 Cyc    P-Flag
  880.              ├─────────┤
  881.     XRL A, Rn        │0110 1nnn│                       1 Cyc    P-Flag
  882.              ├─────────┼─────────┐
  883.     XRL A, data      │   65h   │  data   │             1 Cyc    P-Flag
  884.              ├─────────┼─────────┤
  885.     XRL data, A      │   62h   │  data   │             1 Cyc
  886.              ├─────────┼─────────┼─────────┐
  887.     XRL data, #wert  │   63h   │  data   │  wert   │   2 Cyc
  888.              └─────────┴─────────┴─────────┘
  889.  
  890.     ──────────────────────────────────────────────────────────────────
  891.     ???                        Flags: ??
  892.  
  893.     Es gibt einen OpCode beim 8051, der nicht belegt ist (reserved).
  894.  
  895.                ┌─────────┐
  896.                │   A5h   │   ? Cyc
  897.                └─────────┘
  898.  
  899.  
  900.  
  901.  
  902.  
  903.     Pseudo-Befehle:
  904.     ~~~~~~~~~~~~~~~
  905.     Neben den Maschinenbefehlen definieren die Assemblersprachen wei-
  906.     tere Mnemonics, um beispielsweise Tabellen zu erstellen:
  907.  
  908.  
  909.     ──────────────────────────────────────────────────────────────────
  910.     DB, DW                        Flags: -
  911.  
  912.     Define Byte / Word
  913.     
  914.     Die hinter DB oder DW folgenden Werte werden direkt in den Code ge-
  915.     schrieben. Bei DW wird das low Byte zuerst abgelegt!   Beispiele:
  916.  
  917.         DB 22h        ; 22h wird in den Code geschrieben
  918.         DB 'A'        ; 'A' = 41h wird in den Code geschrieben
  919.         DB 13,10,0        ; nacheinander 0Dh,0Ah,00h schreiben
  920.         DB 'Hallo'        ; nacheinander die ASCII-Codes des Strings
  921.         DW 1234h        ; in Code: 34h, 12h
  922.     
  923.  
  924.  
  925.  
  926.     ──────────────────────────────────────────────────────────────────
  927.     CALL                        Flags: -
  928.  
  929.     Der Assembler  setzt hier selbst einen  ACALL oder LCALL  ein. Ist
  930.     die Zieladresse dem Assembler noch nicht bekannt (steht sie weiter
  931.     unten im Code), so setzt er immer einen  LCALL, sonst wenn möglich
  932.     einen ACALL.
  933.  
  934.     CALL codeAdr    ---> ACALL oder LCALL
  935.  
  936.  
  937.  
  938.     ──────────────────────────────────────────────────────────────────
  939.     JMP                        Flags: -
  940.  
  941.     Der Assembler  setzt hier selbst einen  SJMP, AJMP oder LJMP  ein.
  942.     Ist  die Zieladresse dem  Assembler noch nicht bekannt  (steht sie
  943.     weiter unten im Code), so setzt er immer einen  LJMP, sonst wenn
  944.     möglich einen SJMP oder AJMP ein.
  945.  
  946.     JMP codeAdr   ---> SJMP, AJMP oder LJMP
  947.  
  948.  
  949.  
  950.     Adress-Bereiche:
  951.     ~~~~~~~~~~~~~~~~
  952.     Der 8051 besitzt ein internes RAM von 128 Byte, 256 Byte beim 8052.
  953.     Für den Zugriff gibt es mehrere Möglichkeiten: MOV, ANL, ORL, XRL,
  954.     INC, DEC, XCH.
  955.  
  956.     Extern kann ein zusätzliches RAM bis 64 kByte angeschlossen werden.
  957.     Der Zugriff erfolgt über einen  speziellen Befehl (MOVX).  Weiters
  958.     kann extern ein Programmspeicher (EPROM) mit auch maximal 64 kByte
  959.     angeschlossen werden.  Aus dem  Programmspeicher  wird automatisch
  960.     bei jedem Code-Fetch von der CPU-Hardware gelesen. Über den Befehl
  961.     MOVC  kann auch per Software aus dem Programmspeicher gelesen wer-
  962.     den.  Der gültige Adressbereich  hängt von der Beschaltung der je-
  963.     weiligen Rechnerkarte ab.
  964.  
  965.     Für  externe Zugriffe  sind also spezielle Befehle vorgesehen. Bei
  966.     internen Zuriffen wird unterschieden  zwischen  direkter und indi-
  967.     rekter Adressierung. Der Zugriff auf die  SFR erfolgt wie auf eine
  968.     interne Speicherstelle.
  969.  
  970.  
  971.     internes                   Adressbereich für
  972.     RAM ┌────────────┐FF       Spezial- ┌────────────┐FF
  973.         │            │         Funktion-│            │
  974.         │    nur     │         Register │    nur     │
  975.         │  indirekt  │                  │   direkt   │
  976.         │adressierbar│                  │adressierbar│
  977.         │            │                  │            │
  978.         └────────────┘80                └────────────┘80
  979.         ┌────────────┐7F
  980.         │            │
  981.         │ direkt und │         Zugriff auf unterschiedliche Spei-
  982.         │  indirekt  │         cherbereich bei direkter und indi-
  983.         │adressierbar│         rekter Adressierung.
  984.         │            │
  985.         └────────────┘00
  986.  
  987.  
  988.     Neben einem  direkten und indirekten Byte-Zugriff gibt es die Mög-
  989.     lichkeit bei ausgewählten Speicherstellen einzelne Bits zu manipu-
  990.     lieren. Die intern DATA Adressen (internes RAM) 20h bis 2Fh können
  991.     so auch mit den BIT Adressen 00h bis 7Fh angesprochen werden.  Die
  992.     Bit Adressen 80h bis 87h  wirken auf das SFR mit der  DATA Adresse
  993.     80h (P0), BIT 88h bis 8Fh auf DATA 88h, usw. Somit sind einige SFR
  994.     bitweise adressierbar.
  995.  
  996.  
  997.     Zu einigen SFR und internen DATA Adressen gibt es speziell für sie
  998.     geltende Befehle. Diese Befehle besitzen einen kürzeren Opcode und
  999.     erlauben einen schnelleren Zugriff.
  1000.  
  1001.       ACC     =  Rechenregister (Akkumulator)
  1002.       R0..R7  =  spezielle Speicherstellen im internen RAM, die als
  1003.              Register dienen. Auswahl über Wert im PSW:
  1004.              R0..R7 = [00..07], [08..0F], [10..17] oder [18..1F]
  1005.       CY-Flag =  Carry-Flag (liegt im PSW)
  1006.  
  1007.  
  1008.  
  1009.  
  1010.     Die SFR steuern spezielle Hardwarefunktionen wie Timer und seriel-
  1011.     le Schnittstelle.  Das interne RAM wirkt nur als Speicher.  Es hat
  1012.     aber einige Besonderheiten:
  1013.  
  1014.       * die ersten 128 Byte sind direkt adressierbar DATA 00..7Fh
  1015.       * das gesamte interne RAM (bis 256 Byte beim 8052) sind indi-
  1016.         rekt adressierbar IDATA 00..7Fh
  1017.       * die Adressen 20h bis 2Fh sind bitweise adressierbar
  1018.         BIT 00..7Fh.
  1019.       * wahlweise die Adressen 00..07, 08..0Fh, 10..17h oder 18h..1Fh
  1020.         sind als Register adressierbar.
  1021.  
  1022.     Auf  ein und dieselbe  Speicherstelle kann so  für einige Adressen
  1023.     auf verschiedene Weise  zugegriffen werden.  Hinzu kommt noch, daß
  1024.     auch der Stack im internen RAM angelegt wird.  Dazu gibts ein SFR,
  1025.     den Stack-Pointer (SP).  Auf dem Stack  werden bei einem Interrupt
  1026.     oder Call die Return-Adressen abgelegt. Auch die Befehle  PUSH und
  1027.     POP wirken auf den Stack. Der SP wird bei jedem PUSH inkrementiert.
  1028.  
  1029.     Wichtig:   Nach einem Reset ist der SP mit der Adresse 07 geladen.
  1030.       Der erste PUSH erfolgt so auf die Adresse 08. Verwendet das Pro-
  1031.       gramm DATA-Variablen, so muß unbedingt der Stack auf eine Adres-
  1032.       se oberhalb umgelegt werden.
  1033.  
  1034.  
  1035.     Flags:
  1036.     ~~~~~~
  1037.     ┌────┬────┬────┬───┬───┬────┬───┬───┐   Das PSW hält nebenstehende
  1038.     │ CY │ AC │ F0 │RS1│RS0│ OV │ x │ P │   Flags. Einige davon werden
  1039.     └────┴────┴────┴───┴───┴────┴───┴───┘   bei der Befehlsabarbeitung
  1040.                         von der CPU gesetzt.
  1041.  
  1042.     CY = Carry-Flag:
  1043.           CY hält den Übertrag aus Bit 7 bei ADD, ADDC, SUBB, DA, RLC,
  1044.           CY hält den Übertrag aus Bit 0 bei RRC,
  1045.           CY ist Flag für Kleiner/größer bei CJNE
  1046.  
  1047.     AC = Hilfs Carry:
  1048.           AC hält den Übertrag aus Bit 3 bei ADD, ADDC, SUBB
  1049.  
  1050.      P = Parität:
  1051.          P = 1, wenn Anzahl der Bits in ACC ungerade
  1052.  
  1053.     OV = Überlauf:
  1054.           OV = 1, wenn Ergebnis bei MUL größer als 0FFh (WORD),
  1055.           OV = 1, wenn Division durch 0 bei DIV
  1056.           OV = 1, wenn Vorzeichen-Fehler bei ADD, ADDC, SUBB:
  1057.  
  1058.     Beim Rechnen  mit vorzeichenbehafteten Zahlen  repräsentiert Bit 7
  1059.     das  Vorzeichen (1 = Minus).  Werden zwei positive Zahlen addiert,
  1060.     so muß  das Ergebnis  auch positiv sein.  Die CPU addiert nur Hex-
  1061.     Werte. Ein Übertrag in Bit 7, würde aber als negativ interpretiert.
  1062.     Beispiel:   33h + 33h = 66h  und OV = 0;     66h = 102 (dezimal)
  1063.             66h + 66h = CCh  und OV = 1;     CCh = -76 (dezimal)
  1064.  
  1065.     RS1:RS0 selektieren die  aktive Registerbank.  Nach dem  Reset ist
  1066.     PSW mit  00 geladen, damit werden als Register die Adressen 00..07
  1067.     verwendet (deßhalb beginnt der Stack beim Reset erst bei 08).
  1068.  
  1069.  
  1070.     Relative Sprünge:
  1071.     ~~~~~~~~~~~~~~~~~
  1072.     Bei relativen Sprüngen  wird zuerst der Befehls-Zeiger (IP) incre-
  1073.     mentiert und anschließend wird dazu der im Opcode enthaltene rela-
  1074.     tive Offset addiert. Vor der Addition erfolgt eine BYTE->WORD Kon-
  1075.     vertierung des Offset-Wertes.
  1076.  
  1077.     Der Offsetwert aus dem Opcode  stellt dabei eine Zahl  mit Vorzei-
  1078.     chen dar, entsprechend ergibt die Konvertierung:
  1079.  
  1080.          7Ah  -->  007Ah       hier +122 (dez)
  1081.          B4h  -->  FFB4h       hier  -52 (dez)
  1082.  
  1083.  
  1084.     Absolute Sprünge:
  1085.     ~~~~~~~~~~~~~~~~~
  1086.     Bei  absoluten Sprüngen  und Calls wird zuerst der  Befehls-Zeiger
  1087.     (PC) incrementiert.  Die Zieladresse wird  danach gebildet,  indem
  1088.     die 5 höchsten Bits aus dem PC übernommen werden  (PC AND 0F800h),
  1089.     während die 11 niederwertigeren Bits aus dem Opcode gelesen werden.
  1090.     Dazu wird das  high Byte  des Opcode um  5 Stellen nach rechts ge-
  1091.     schiftet, das low Byte wird belassen.  Dieser Wert wird logisch OR
  1092.     mit dem PC verknüpft.
  1093.  
  1094.  
  1095.     Zeit für Befehlsausführung:
  1096.     ~~~~~~~~~~~~~~~~~~~~~~~~~~~
  1097.     Zur Ausführung vieler Befehle  wird nur 1 CPU-Zyclus benötigt. Ei-
  1098.     nige, insbesondes solche mit Zugriff auf externe Speicher, benöti-
  1099.     gen 2 Zycluse.  Ein Zyclus  dauert  6 CPU-Takte (= 12 Quarztakte).
  1100.     Bei 12 MHz dauert so 1 Zyclus 1 µs. In jedem Zyclus werden die Ti-
  1101.     mer falls sie laufen jeweils um 1 incrementiert.
  1102.  
  1103.  
  1104.     Stack:
  1105.     ~~~~~~
  1106.     Der  Stack liegt im  internen RAM und wächst von  unten nach oben.
  1107.     Der SP zeigt auf den zuletzt gepushten Wert. Ist der SP größer 7Fh
  1108.     beim 8051 (oder BFh beim 8044) so wird er bei einem PUSH weiterhin
  1109.     incrementiert,  aber bei einem POP kommt nur #0FFh zurück, der ge-
  1110.     pushte Wert ist verloren. Wird der SP über  0FFh hinaus  incremen-
  1111.     tiert, so überschreibt der Stack die Adressen 00....
  1112.  
  1113.     Bei Calls  und Interrupts  wird von der CPU  die Returnadresse auf
  1114.     den Stack gelegt (low Byte zuerst).  Bei einem Interrupt  wird nur
  1115.     die Returnadress auf den Stack gesichert (nicht wie beim 8088 auch
  1116.     die Flags).
  1117.  
  1118.  
  1119.  
  1120.     allgemeine Bemerkungen zur Syntax:
  1121.     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  1122.     Die meißten Assemblern  erwarten bei  der Eingabe von Zahlen einen
  1123.     dezimalen Wert. Bei HEX-Zahlen ist ein h  und bei Binär-Zahlen ein
  1124.     b anzuhängen. Jede Zahl muß mit einer Ziffer zwischen 0 und 9  be-
  1125.     ginnen. Bei HEX-Zahlen ist gegebenenfalls eine 0 voranzustellen.
  1126.  
  1127.     #  vor einer Zahl heißt, das es sich um einen konstanter Wert han-
  1128.        delt. Alle anderen Zahlenwerte, ohne #, werden als Adressen an-
  1129.        gesehen.
  1130.  
  1131.     @  weißt auf eine indirekte Adressierung  hin. (Inhalt jener Spei-
  1132.        cherstelle,  deren Adresse in der hinter  @  stehenden Register
  1133.        steht.
  1134.  
  1135.     A  steht für Akkumulator (= ACC, jedoch wird ein spezieller Opcode
  1136.        erzeugt, wenn A anstelle von ACC verwendet wird)
  1137.  
  1138.     C  steht für Carry-Flag  (= CY,  jedoch wird ein spezieller Opcode
  1139.        erzeugt, wenn C anstelle von CY verwendet wird)
  1140.  
  1141.     DPTR = Datenpointer setzt sich zusammen aus DPH und DPL.
  1142.  
  1143.     PC = Programm-Counter  (zeigt auf den nächsten abzuarbeitenden Be-
  1144.          fehl). Der PC ist kein SFR,  er kann nicht per Software gele-
  1145.          sen werden. Gewissermaßen stellt aber der LJMP einen Schreib-
  1146.          Befehl in den PC dar.
  1147.  
  1148.  
  1149.  
  1150.  
  1151.  
  1152.  
  1153.  
  1154.     verwendete Abkürzungen:
  1155.     -----------------------
  1156.  
  1157.     Ri  (mit i = 0...1)  -->  verwendet, um anzudeuten, daß R0 oder R1
  1158.         für diesen Befehl zulässig sind
  1159.  
  1160.     Rn  (mit n = 0...7)  -->  verwendet, um anzudeuten, daß R0 ... R7
  1161.         für diesen Befehl zulässig sind.
  1162.  
  1163.     data  -->  es ist eine direkt adressierbare Speicherstelle anzuge-
  1164.            ben (internes RAM 00..7Fh oder SFR 80..FFh). Der Inhalt
  1165.            dieser Speicherstelle wird für die Operation verwendet.
  1166.  
  1167.     #wert -->  der angegebene Wert wird für die Operation verwendet.
  1168.  
  1169.     codeAdr -->  Zieladresse bei Sprüngen, CALL's.  Auch bei SJMP wird
  1170.              immer die Zieladresse angeschrieben.  Erst der Assem-
  1171.              bler berechnet den Offset und trägt ihn in den Opcode
  1172.              ein.
  1173.  
  1174.  
  1175.  
  1176.  
  1177.  
  1178.  
  1179.